package com.jie.commonlib.widget

import android.content.Context
import android.util.AttributeSet
import android.view.LayoutInflater
import kotlin.jvm.JvmOverloads
import android.widget.FrameLayout
import androidx.annotation.DrawableRes
import com.jie.commonlib.R
import androidx.annotation.StringRes
import com.blankj.utilcode.util.StringUtils
import com.jie.commonlib.databinding.ViewEmptyBinding

/**
 *
 * @author ZDST-03
 * @date 2018/4/3
 * 空数据或数据加载失败时的组件
 */
class EmptyView @JvmOverloads constructor(
    context: Context,
    attrs: AttributeSet? = null,
    defStyleAttr: Int = 0
) : FrameLayout(context, attrs, defStyleAttr) {

    private lateinit var mEmptyViewBinding : ViewEmptyBinding
    /**
     * 区分显示时为空数据，还是加载失败
     * null:数据正常 true:数据为空 false:加载失败
      */
    private var isEmpty : Boolean? = null

    private fun initView() {
        mEmptyViewBinding = ViewEmptyBinding.inflate(LayoutInflater.from(context), this)
    }

    /**
     * 显示或隐藏空数据页面
     * @param show
     * true:展示空数据组件，隐藏内容子组件
     * false:隐藏空数据组件，显示内容子组件
     */
    fun showOrHiddenEmpty(show: Boolean) {
        showOrHidden(show, R.string.empty_view_empty_data)
    }

    /**
     * 显示或隐藏加载失败页面
     * @param show
     * true:展示加载失败组件，隐藏内容子组件
     * false:隐藏加载失败组件，显示内容子组件
     */
    fun showOrHiddenFailed(show: Boolean) {
        showOrHidden(show, R.string.empty_view_failed_to_load)
    }

    /**
     * 显示或隐藏空数据页面
     * @param show true:展示加载失败组件，隐藏内容子组件
     *             false:隐藏加载失败组件，显示内容子组件
     * @param msgId 自定义提示文本信息
     * @param iconId 自定义提示图片
     */
    fun showOrHidden(show: Boolean, @StringRes msgId: Int, @DrawableRes iconId : Int = R.drawable.ic_empty_data) {
        isEmpty = if (show) {
            setIcon(iconId)
            setContent(msgId)
            iconId == R.string.empty_view_empty_data
        } else {
            null
        }
        showOrHiddenChildView(show)
    }

    /**
     * 空组件点击事件监听
     */
    fun clickEmptyOrFail(clickListener : () -> Unit) {
        mEmptyViewBinding.llContent.setOnClickListener {
            clickListener.invoke()
        }
    }

    /**
     * 显示或隐藏子组件
     * @param showEmpty
     */
    private fun showOrHiddenChildView(showEmpty: Boolean) {
        for (i in 0 until childCount) {
            val childAt = getChildAt(i) ?: continue
            val isEmptyChild = childAt.id == R.id.llContent
            val childCanShow = isEmptyChild && showEmpty || !isEmptyChild && !showEmpty
            childAt.visibility =
                if (childCanShow) VISIBLE else INVISIBLE
        }
    }

    /**
     * 设置显示图标
     * @param icon
     */
    private fun setIcon(icon: Int) {
        mEmptyViewBinding.ivIcon.run {
            val error = icon <= 0
            visibility = if (error) GONE else VISIBLE
            if (!error) {
                mEmptyViewBinding.ivIcon.setImageResource(icon)
            }
        }
    }

    /**
     * 设置显示内容
     * @param content
     */
    private fun setContent(content: Int) {
        mEmptyViewBinding.tvContent.run {
            val error = content <= 0
            visibility = if (error) GONE else VISIBLE
            if (!error) {
                mEmptyViewBinding.tvContent.text = StringUtils.getString(content)
            }
        }
    }

    init {
        initView()
    }
}